package com.zhouhong.muke_leetcode_two;

import java.util.LinkedHashMap;

/**
 * @ClassName: Algorithm-and-Data-Structure
 * @Description:
 * @Author: zhouhong
 * @Create: 2021-04-06 19:46
 **/

//运用你所掌握的数据结构，设计和实现一个 LRU (最近最少使用) 缓存机制 。
// 实现 LRUCache 类：
// LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
// int get(int key) 如果关键字 key 存在于缓存中，则返回关键字的值，否则返回 -1 。
// void put(int key, int value) 如果关键字已经存在，则变更其数据值；如果关键字不存在，则插入该组「关键字-值」。当缓存容量达到上
//限时，它应该在写入新数据之前删除最久未使用的数据值，从而为新的数据值留出空间。

public class LRUCache0146 {

    private LinkedHashMap<Integer, Integer> map;
    private int size;

    public LRUCache0146(int capacity) {
        map = new LinkedHashMap<>();
        size = capacity;
    }

    public int get(int key) {
        // 判断所查元素在map中是否存在,如果存在，先记录保存这个元素，
        // 然后从map中移除这个元素，之后再将这个元素加进来，表示是最近使用过的。
        if (map.containsKey(key)){
            int value = map.remove(key);
            map.put(key, value);
            return value;
        }
        return -1;
    }

    public void put(int key, int value) {
        if (map.containsKey(key)){
            map.remove(key);
        }else if (map.size() + 1 > size){
            map.remove(map.keySet().iterator().next());
        }
        map.put(key, value);
    }
}
